package com.xiaolin.structure.stack.linked;

/**
 * @ClassName DemoStack
 * @Description 栈数据结构实现-根据单向链表实现
 * @Detail detail
 * @Author MyPC
 * @Date 2020/12/12
 * @Version 1.0
 */
public class DemoStack<E> {
    private Node<E> first;
    private Node<E> top;
    private int size;

    private void checkout(int index){
        if(index<0 || index >= size){
            throw new IndexOutOfBoundsException("索引越界");
        }
    }

    /**
     * 获取倒数第二个节点
     * @return
     */
    private Node<E> getPreNode(){
        if(size <= 0){
            throw new IndexOutOfBoundsException("栈为空");
        }
        Node<E> temp=first;
        for (int i=1;i<size-1;i++){
            temp=temp.next;
        }
        return temp;
    }

    /**
     * 添加元素
     * @param e
     * @return
     */
    public boolean add(E e){
        if(size==0){
            // 添加第一个元素
            top=new Node<>(e);
            first=top;
        }else {
            top.next=new Node<>(e);
            top=top.next;
        }
        size++;
        return true;
    }

    /**
     * 索引元素
     * @param index
     * @return
     */
    public E getElement(int index){
        checkout(index);
        Node<E> temp=first;
        for (int i=0;i<index;i++){
            temp=temp.next;
        }
        return temp.item;
    }

    /**
     * 弹出元素
     * @return
     */
    public E pop(){
        Node<E> preNode = getPreNode();
        Node<E> remove=top;
        preNode.next=null;
        top=preNode;
        size--;
        return remove.item;
    }

    /**
     * 获取顶峰元素
     * @return
     */
    public E peek(){
        return top.item;
    }

    /**
     * 获取栈元素个数
     * @return
     */
    public int size(){
        return size;
    }

}
